﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using TencentWeiboSDK;
using TencentWeiboSDK.Services.Util;
using QWeiBoN.Util;
using Microsoft.Phone.Tasks;

namespace QWeiBoN
{
    public partial class App : Application
    {
        /// <summary>
        ///提供对电话应用程序的根框架的轻松访问。
        /// </summary>
        /// <returns>电话应用程序的根框架。</returns>
        public PhoneApplicationFrame RootFrame { get; private set; }

        /// <summary>
        /// Application 对象的构造函数。
        /// </summary>
        public App()
        {
            // 未捕获的异常的全局处理程序。 
            UnhandledException += Application_UnhandledException;

            // 标准 Silverlight 初始化
            InitializeComponent();

            // 特定于电话的初始化
            InitializePhoneApplication();

            //加载样式
            App.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri(Util.ThemeUtil.ThemeFile(), UriKind.Relative) });

            // 调试时显示图形分析信息。
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 显示当前帧速率计数器。
                Application.Current.Host.Settings.EnableFrameRateCounter = true;

                // 显示在每个帧中重绘的应用程序区域。
                //Application.Current.Host.Settings.EnableRedrawRegions = true；

                // 启用非生产分析可视化模式， 
                // 该模式显示递交给 GPU 的包含彩色重叠区的页面区域。
                //Application.Current.Host.Settings.EnableCacheVisualization = true；

                // 通过将应用程序的 PhoneApplicationService 对象的 UserIdleDetectionMode 属性
                // 设置为 Disabled 来禁用应用程序空闲检测。
                //  注意: 仅在调试模式下使用此设置。禁用用户空闲检测的应用程序在用户不使用电话时将继续运行
                // 并且消耗电池电量。
                PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
            }

            // 配置 AppKey 和 AppSecret
            OAuthConfigruation.APP_KEY = "801142063";
            OAuthConfigruation.APP_SECRET = "8fe89662b115d7e1cb46766e9fd7f5ee";

            // 若你希望自己管理 AccessToken 则设置此参数.
            //OAuthConfigruation.IfSaveAccessToken = false;
        }

        // 应用程序启动(例如，从“开始”菜单启动)时执行的代码
        // 此代码在重新激活应用程序时不执行
        private void Application_Launching(object sender, LaunchingEventArgs e)
        {
        }

        // 激活应用程序(置于前台)时执行的代码
        // 此代码在首次启动应用程序时不执行
        private void Application_Activated(object sender, ActivatedEventArgs e)
        {
        }

        // 停用应用程序(发送到后台)时执行的代码
        // 此代码在应用程序关闭时不执行
        private void Application_Deactivated(object sender, DeactivatedEventArgs e)
        {
        }

        // 应用程序关闭(例如，用户点击“后退”)时执行的代码
        // 此代码在停用应用程序时不执行
        private void Application_Closing(object sender, ClosingEventArgs e)
        {
        }

        // 导航失败时执行的代码
        private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            if (StringUtil.IsUrl(e.Uri.ToString()))
            {
                WebBrowserTask task = new WebBrowserTask();
                task.Uri = e.Uri;
                task.Show();
            }
            else
            {
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    // 导航已失败；强行进入调试器
                    System.Diagnostics.Debugger.Break();
                }
            }
        }

        // 出现未处理的异常时执行的代码
        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // 出现未处理的异常；强行进入调试器
                System.Diagnostics.Debugger.Break();
            }
            e.Handled = true;
            if (RootFrame.CanGoBack)
            {
                RootFrame.GoBack();
            }
        }

        #region 电话应用程序初始化

        // 避免双重初始化
        private bool phoneApplicationInitialized = false;

        // 请勿向此方法中添加任何其他代码
        private void InitializePhoneApplication()
        {
            if (phoneApplicationInitialized)
                return;

            // 创建框架但先不将它设置为 RootVisual；这允许初始
            // 屏幕保持活动状态，直到准备呈现应用程序时。
            RootFrame = new PhoneApplicationFrame();
            RootFrame.Navigated += CompleteInitializePhoneApplication;

            // 处理导航故障
            RootFrame.NavigationFailed += RootFrame_NavigationFailed;

            // 确保我们未再次初始化
            phoneApplicationInitialized = true;

            RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);
        }

        void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
        {
            if (e.Uri.ToString().Contains(@"/LoginPage.xaml"))
            {
                try
                {
                    // 验证 OAuth 相关配置.
                    OAuthConfigruation.Validate();

                    RootFrame.Dispatcher.BeginInvoke(() =>
                    {
                        string url = e.Uri.ToString().Replace("LoginPage", "MainPage");
                        RootFrame.Navigate(new Uri(url, UriKind.Relative));
                    });
                    e.Cancel = true;
                }
                catch (MissingAccessTokenExcception ex)
                {
                    e.Cancel = false;
                }
                // 可以在此处获取“未设置 AppKey 和 AppSerect 的异常
                //catch (AppKeyAndSecretMissingException ex)
                //{ 
                //    // 退出应用程序
                //}
            }
        }

        // 请勿向此方法中添加任何其他代码
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
            // 设置根视觉效果以允许应用程序呈现
            if (RootVisual != RootFrame)
                RootVisual = RootFrame;

            // 删除此处理程序，因为不再需要它
            RootFrame.Navigated -= CompleteInitializePhoneApplication;
        }

        #endregion

        #region 退出程序

        private class QuitException : Exception { }

        /// <summary>
        /// 退出应用
        /// </summary>
        public static void Quit()
        {
            //throw new QuitException();
        }

        #endregion
    }
}